package me.ree.zkproduct.service.impl;

import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

/**
 * ServiceA与ServiceB都是验证循环依赖的类，这两个类互相依赖
 *
 * 1.@Lazy注解可以消除循环依赖，无论是直接加在依赖字段上还是加在构造方法的参数上
 * 2.使用@Data注解或者手动添加依赖字段的get方法（set方法不会导致这个问题），并且对ServiceA或ServiceB对象进行json序列化的时候，
 * 虽然启动项目不会报循环依赖的错误，但是在json序列化的代码执行时，会导致Method threw 'java.lang.StackOverflowError' exception，
 * 堆栈溢出的问题，这是循环依赖对象在json序列化时产生了无限递归导致的，但是为什么json序列化会导致无限递归的原因尚未查明。
 * 此外，使用@Data注解或者手动添加依赖字段的get方法有一个小的差异：
 * 使用@Data注解时，在debug阶段，就能看到ServiceA和ServiceB上有显示StackOverflowError的信息，但是代码可以继续执行，
 * 直到执行json序列化代码时报错；
 * 如果是只有get方法时，debug阶段尚未执行到json序列化的代码时没有任何异常信息，只有执行到那句时才报错。
 * 注意：
 * 对ServiceA和ServiceB进行调用的代码见TestController.testCyclicDependenceByLazy
 */
//@Data
@Service
public class ServiceA {

    @Autowired
    @Lazy
    private ServiceB serviceB;

    private String name;

    private int age;


//    @Autowired
//    public ServiceA(ServiceB serviceB) {
//        this.serviceB = serviceB;
//    }

    public ServiceB getServiceB() {
        return this.serviceB;
    }

//    public void setServiceB(ServiceB serviceB) {
//        this.serviceB = serviceB;
//    }

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
